package com.tarena.lbs.user.service.impl;

import com.tarena.lbs.base.common.utils.Asserts;
import com.tarena.lbs.base.protocol.exception.BusinessException;
import com.tarena.lbs.base.protocol.model.Result;
import com.tarena.lbs.common.principle.UserPrinciple;
import com.tarena.lbs.common.utils.AuthenticationContextUtils;
import com.tarena.lbs.user.dao.mapper.UserTagsMapper;
import com.tarena.lbs.user.dao.repository.UserRepository;
import com.tarena.lbs.user.dao.repository.UserTagsRepository;
import com.tarena.lbs.user.pojo.param.UserParam;
import com.tarena.lbs.user.pojo.param.UserTagsParam;
import com.tarena.lbs.user.pojo.po.UserPO;
import com.tarena.lbs.user.pojo.vo.UserVO;
import com.tarena.lbs.user.service.UserService;
import com.tarena.lbs.user.utils.RandomUserName;
import io.swagger.v3.oas.models.security.SecurityScheme;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private UserTagsRepository usertagsRepository;


    @Override
    public void register(UserParam param) throws BusinessException {
        String phone = param.getPhone();
        Long count = userRepository.countUserByPhone(phone);
        Asserts.isTrue(count>0,new BusinessException("-2","手机号已经存在"));
        //2.封装数据
        UserPO poParam = assembleUserPO(param);
        log.debug("-----------------{}",poParam);
        //3.直接写入数据库
        userRepository.save(poParam);
    }

//    @Override
//    public UserVO detail() throws BusinessException {
//        //1.解析jwt 拿到userPrinciple
//        UserPrinciple userPrinciple = AuthenticationContextUtils.get();
//        Asserts.isTrue(userPrinciple==null,new BusinessException("-2","用户认证解析失败"));
//        Integer userId = userPrinciple.getId();
//        //2.仓储层查询唯一的po
//        UserPO po = userRepository.getById(userId);
//        Asserts.isTrue(po==null,new BusinessException("-2","用户信息不存在"));
//        //3.转化vo
//        UserVO vo=new UserVO();
//        BeanUtils.copyProperties(po,vo);
//        return vo;
//    }

    //通过id查询用户信息
    @Override
    public UserVO getById(Long id) {
        log.info("通过id查询用户信息");
        UserPO po = userRepository.getById(id.intValue());
        if(po!=null){
            UserVO vo=new UserVO();
            BeanUtils.copyProperties(po,vo);
            return vo;
        }else{
            log.info("用户不存在");
            return null;
        }
    }

    @Override
    public boolean checkTagRelation(Integer userId, String tagIds) {
        // 1. 处理 tagIds 参数（逗号分割转成 ID 列表）
        List<Long> tagIdList = new ArrayList<>();
//        String tagIds = param.getTagIds();
        if (tagIds != null && !tagIds.trim().isEmpty()) {
            for (String id : tagIds.split(",")) {
                tagIdList.add(Long.parseLong(id));
            }
        }
        // 2. 模拟数据库查询（实际需替换为 Mapper 逻辑）
        // 示例逻辑：若 tagIds 和 userid 匹配则返回 true，否则 false
        // 真实场景：调用 tagRelationMapper.countRelations(userid, tagIdList) > 0
        boolean mockResult = false;
        // 这里写真实业务逻辑，比如查关联表：
        //usertagsRepository.countRelations(userId, tagIdList);
        mockResult=usertagsRepository.countRelations(userId, tagIdList)>0;
        if(!mockResult){
            //新增
            int rows = usertagsRepository.save(userId,tagIdList);
            return rows>0;
        }else{
            return false;
        }

    }

    @Override
    public List<UserVO> list(UserParam param) {
        log.info("用户列表查询参数：{}",param);
        List<UserPO> list = userRepository.listUser(param);
        List<UserVO> listVO = list.stream().map(po -> {
            UserVO vo = new UserVO();
            BeanUtils.copyProperties(po, vo);
            return vo;
        }).collect(Collectors.toList());
        return listVO;
    }


//    @Override
//    public boolean checkTagRelation(UserTagsParam param) {
//        // 1. 处理 tagIds 参数（逗号分割转成 ID 列表）
//        List<Long> tagIdList = new ArrayList<>();
//        String tagIds = param.getTagIds();
//        if (tagIds != null && !tagIds.trim().isEmpty()) {
//            for (String id : tagIds.split(",")) {
//                tagIdList.add(Long.parseLong(id));
//            }
//        }
//        // 2. 模拟数据库查询（实际需替换为 Mapper 逻辑）
//        // 示例逻辑：若 tagIds 和 userid 匹配则返回 true，否则 false
//        // 真实场景：调用 tagRelationMapper.countRelations(userid, tagIdList) > 0
//        boolean mockResult = false;
//        // 这里写真实业务逻辑，比如查关联表：
//        // mockResult = tagRelationMapper.countRelations(userid, tagIdList) > 0;
//        return mockResult;
//    }


    private UserPO assembleUserPO(UserParam param) {
        UserPO po=new UserPO();
        BeanUtils.copyProperties(param,po);
        /*//补充必要数据 用户状态 0表示没有绑定标签 1 表示绑定了标签
        po.setStatus(0);
        //用户昵称 注册时候 不是用户填写的 为了快速注册 我们随机生成一个
        String randomName = RandomUserName.createRandomName();//老 大 小  张王李赵
        po.setNickName(randomName);
        po.setUserName(randomName);*/
        //注册时间
        po.setRegTime(new Date());
        return po;
    }

}
